/*
* Sun Public License Notice
*
* The contents of this file are subject to the Sun Public License
* Version 1.0 (the "License"). You may not use this file except in
* compliance with the License. A copy of the License is available at
* http://www.sun.com/
*
* The Original Code is NetBeans. The Initial Developer of the Original
* Code is Sun Microsystems, Inc. Portions Copyright 1997-2000 Sun
* Microsystems, Inc. All Rights Reserved.
*/
package org.netbeans.modules.jini;
import java.io.*;
import java.util.*;
import java.beans.*;
import net.jini.core.discovery.*;
import net.jini.core.lookup.*;
import net.jini.lookup.*;
import org.openide.nodes.*;
import org.openide.src.*;
import org.openide.src.nodes.*;
import org.openide.util.actions.*;
/**
* Represents lookup results in specified domain. The domain
* is determined by BrowserModel. Contains three subnodes:
* <p>
* <li> Entries all available entry types in discovery domain
* <li> Interfaces all available interfaces in discovery domain
* <li> Services all available service instances in discovery domain
*
* @author Petr Kuzel
* @version
*/
class LookupChildren extends Children.Array {
BrowserModel browser;
private boolean created = false;
public LookupChildren(BrowserModel browser) {
this.browser = browser;
}
public void addNotify() {
if (created) return;
add( new Node[] {
//new GroupsNode(loc),
//new ServiceTypesNode(loc),
new EventsNode(new EventsChildren(browser)),
new EntriesNode(new EntriesChildren(browser)),
new ServiceInterfacesNode(new ServiceInterfacesChildren(browser)),
new ServicesNode(new ServicesChildren(browser))
});
created = true;
}
class EventsNode extends DefaultNode {
public EventsNode(EventsChildren kids) {
super(kids);
setName("Events");
setIconBase(Util.getString("EVENTS_ICON_BASE"));
systemActions = new SystemAction[] { };
}
}
public class EventsChildren extends Children.Keys implements PropertyChangeListener {
BrowserModel browser;
public EventsChildren(BrowserModel browser) {
this.browser = browser;
}
public void addNotify() {
browser.addPropertyChangeListener(this);
setKeys(browser.getEvents());
}
public void removeNotify() {
browser.removePropertyChangeListener(this);
setKeys(Collections.EMPTY_SET);
}
public void propertyChange(final PropertyChangeEvent e) {
if (e.getPropertyName().equals("events")) {
setKeys((List)e.getNewValue());
}
}
protected Node[] createNodes(Object key) {
if (key instanceof BrowserEvent) {
BrowserEvent e = (BrowserEvent) key;
return new Node[] { new EventNode(e) };
}
return null;
}
public class EventNode extends DefaultNode {
BrowserEvent e;
public EventNode(BrowserEvent e) {
super(Children.LEAF);
this.e = e;
setDisplayName(e.getName());
setName(e.toString());
setIconBase(Util.getString("EVENT_ICON_BASE"));
}
protected Sheet createSheet() {
Sheet s = super.createSheet();
Sheet.Set ss = s.get(Sheet.PROPERTIES);
if (ss == null) {
ss = s.createPropertiesSet();
s.put(ss);
}
Node.Property p;
try {
Object obj = this;
p = new PropertySupport.Reflection (obj, String.class, "getDetail", null);
p.setName("Detail");
// p.setDisplayName(Util.getString("PROP_getHost"));
// p.setShortDescription(Util.getString("HINT_getHost"));
ss.put(p);
p = new PropertySupport.Reflection (obj, String.class, "getTime", null);
p.setName("Time");
// p.setDisplayName(Util.getString("PROP_getPort"));
// p.setShortDescription(Util.getString("HINT_getPort"));
ss.put(p);
} catch (Exception ex) {
throw new InternalError();
}
return s;
}
public String getDetail() {
return e.getDetail();
}
public String getTime() {
return new Date(e.getTime()).toString();
}
}
}
/** Hode that contains all services.
*/
class ServicesNode extends DefaultNode {
public ServicesNode(ServicesChildren kids) {
super(kids);
setName("Services");
setIconBase(Util.getString("SERVICES_ICON_BASE"));
}
}
class ServicesChildren extends Children.Keys implements ServiceDiscoveryListener {
/**
* @associates ServiceItemExt
*/
private TreeSet keys;
private boolean created = false;
private BrowserModel browser;
public ServicesChildren(BrowserModel browser) {
keys = new TreeSet(new Util.ClassCollator());
this.browser = browser;
}
protected void addNotify() {
if (!created) {
browser.addListener(this);
}
created = true;
}
protected void removeNotify() {
// do nothing
// let keys stays up to date even if closed
}
void destroy() {
if (!created) return;
browser.removeListener(this);
browser.terminate();
browser = null;
keys = null;
created = false;
}
protected Node[] createNodes(Object key) {
return new Node[] { new ServiceNode((ServiceItemExt)key) };
}
public void serviceAdded(ServiceDiscoveryEvent event) {
keys.add(new ServiceItemExt(event.getPostEventServiceItem()));
setKeys(keys);
}
public void serviceRemoved(ServiceDiscoveryEvent event) {
keys.remove(new ServiceItemExt(event.getPreEventServiceItem()));
setKeys(keys);
}
public void serviceChanged(ServiceDiscoveryEvent event) {
refreshKey(new ServiceItemExt(event.getPostEventServiceItem()));
}
}
/** Contains async keys */
class EntriesNode extends DefaultNode {
EntriesNode(EntriesChildren kids) {
super(kids);
setName("Entries");
setIconBase(Util.getString("ENTRY_CLASSES_ICON_BASE"));
}
}
class EntriesChildren extends Children.Keys implements PropertyChangeListener {
BrowserModel browser;
private boolean created = false;
public EntriesChildren(BrowserModel browser) {
this.browser = browser;
}
public void addNotify() {
if (created) return;
setKeys(browser.getEntryClasses());
browser.addPropertyChangeListener(this);
created = true;
}
/** Notify that the source brovser has changed state. */
public void propertyChange(final PropertyChangeEvent e) {
if ("entries".equals(e.getPropertyName()) ) {
if (this.browser == browser) {
setKeys(browser.getEntryClasses());
}
}
}
protected Node[] createNodes(Object key) {
if (key instanceof Class) {
Class clzz = (Class) key;
ClassElement ce = ClassElement.forClass(clzz);
ClassElementFilter filter = new ClassElementFilter();
filter.setModifiers(filter.PUBLIC | filter.FIELD);
ClassChildren kids = new ClassChildren(ce);
kids.setFilter(filter);
return new Node[] {
new EntryClassNode(clzz, ce, kids, false)
};
}
return null;
}
private class EntryClassNode extends ClassElementNode {
public EntryClassNode(Class cl, ClassElement el, ClassChildren kids, boolean flag) {
super(el, kids, flag);
setDisplayName(cl.getName());
}
}
}
/** Node entry for all looked up interfaces in domain.
*/
class ServiceInterfacesNode extends DefaultNode {
/** Creates new ServiceInterfacesNode */
public ServiceInterfacesNode(ServiceInterfacesChildren kids) {
super(kids);
setName("Interfaces");
setIconBase(Util.getString("INTERFACES_ICON_BASE"));
systemActions = new SystemAction[] { };
}
}
class ServiceInterfacesChildren extends Children.Keys implements PropertyChangeListener {
BrowserModel browser;
private boolean created = false;
public ServiceInterfacesChildren(BrowserModel browser) {
this.browser = browser;
}
public void addNotify() {
if (created) return;
setKeys(browser.getServiceInterfaces());
browser.addPropertyChangeListener(this);
created = true;
}
/** Notify that the source brovser has changed state. */
public void propertyChange(final PropertyChangeEvent e) {
if ("services".equals(e.getPropertyName()) ) {
if (this.browser == browser) {
setKeys(browser.getServiceInterfaces());
}
}
}
protected Node[] createNodes(Object key) {
if (key instanceof Class) {
Class clzz = (Class) key;
ClassElement ce = ClassElement.forClass(clzz);
return new Node[] {
new InterfaceNode(clzz, ce)
};
}
return null;
}
}
//
// TODO, very low priority
//
/** Contains async keys */
class ServiceTypesNode extends DefaultNode {
ServiceTypesNode(LookupLocator loc) {
super(Children.LEAF);
setName("Service Types");
}
}
/** Contains async keys */
class GroupsNode extends DefaultNode {
GroupsNode(LookupLocator loc) {
super(Children.LEAF);
setName("Groups");
}
}
}
/*
* <<Log>>
* 3 Gandalf 1.2 2/7/00 Petr Kuzel More service details
* 2 Gandalf 1.1 2/3/00 Petr Kuzel Be smart and documented
* 1 Gandalf 1.0 2/2/00 Petr Kuzel
* $
*/